package br.unifor.bd.protocol;

public class Operacao {

	private final TipoDeOperacao tipoDeOperacao;

	private Character objeto;

	private final String idDaTransacao;

	private Transacao transacao;

	public Operacao(TipoDeOperacao tipoDeOperacao, String idDaTransacao) {
		this.tipoDeOperacao = tipoDeOperacao;
		this.idDaTransacao = idDaTransacao;
	}

	public Operacao(TipoDeOperacao tipoDeOperacao, String transactionId,
			Character objeto) {
		this(tipoDeOperacao, transactionId);
		this.objeto = objeto;
	}

	public boolean isCommit() {
		return tipoDeOperacao == TipoDeOperacao.COMMIT;
	}

	public TipoDeOperacao getTipoDeOperacao() {
		return tipoDeOperacao;
	}

	public Character getAlvo() {
		return objeto;
	}

	public boolean ehDaMesmaTransacaoQue(Operacao operacao) {
		return this.idDaTransacao == operacao.idDaTransacao;
	}

	@Override
	public String toString() {
		return new StringBuffer().append(tipoDeOperacao.toString())
				.append(transacao.getId().charAt(1))
				.append(objeto == null ? "" : "(" + objeto + ")")
				.toString();
	}

	public boolean isRead() {
		return tipoDeOperacao == TipoDeOperacao.READ;
	}

	public boolean isWrite() {
		return tipoDeOperacao == TipoDeOperacao.WRITE;
	}

	public String getIdDaTransacao() {
		return idDaTransacao;
	}

	public void setTransacao(Transacao transacao) {
		this.transacao = transacao;
	}

	public Transacao getTransacao() {
		return transacao;
	}

}
